package LeeJS;

public class J18_OOP4 {
	
	/*
			
			static
			일반적으로 객체를 생성할려면 생성자를 사용해야 함
			하지만, 생성자 없이도 객체를 바로 사용할 수 도 있음
			
			static 예약어를 멤버변수나 메서드에 사용하면
			객체생성없이 바로 클래스를 사용할 수 있음
			static 으로 선언된 멤버변수는 클래스명, 멤버변수 형태로 사용
			static 으로 선언된 메서드는 클래스명, 메서드 형태로 사용
			static 으로 선언된 멤버변수를 클래스 (공용)변수라고 부르기도 함
			이것과 유사하게 c 나 c++ 에서는 전역변수라 함
			
			static 으로 선언된 멤버변수는 main() 메서드가 
			호출되기 전에 먼저 메모리에 변수공간이 생성됨
			
			반면 객체는 main() 메서드가 호출되고
			해당 클래스의 생성자가 호출되어야만 변수공간이 생성
			
			OOP 작성기법1
			프로그램 작성시 클래스는 용도(값, 처리)에 따라 최소 2개이상으로 나눠서 작성하는 것을 추천
			값만을 저장하는 클래스 :value object class
			값을 받아 처리만 하는 클래스 : service class
			
			인수 전달 방식
			
	 */

	public static void main(String[] args) {
		Rent r20131107001 = new Rent();
		r20131107001.retno = 432;		//대여번호
		r20131107001.bookno = 53262;	//대여한 대상 번호
		r20131107001.memberno = 7;		//대여한 사람 번호
		r20131107001.showRentInfo();
		
		//static 으로 선언된 클래스 사용
		staticRent.bookno = 12313544;
		staticRent.retno = 635445;
		staticRent.memberno = 34354;
		staticRent.showRentInfo();
		
		
		//성적데이터 초기화
		
		SungJuk ww = new SungJuk();
		
		ww.kor = 75;
		ww.eng = 78;
		ww.mat = 98;
		//ww.tot = ww.kor + ww.eng + ww.mat;	//총점이 어떻게 계산되는지가 다보임
		ww.tot = ww.showTotal();				//메소드로 하는 것이기 때문에 총점 계산이 안보임(캡슐화)
		
		
		//성적데이터 초기화 2
		SungJukVO sjvo = new SungJukVO(99,88,44);		//이렇게 초기값을 따로 써줘도 된다
		//생성자를 써서 호출함
		SungJukService sj = new SungJukService();
		sjvo.tot = sj.getTotal(sjvo.kor, sjvo.eng, sjvo.mat);
		
		//생성자를 쓰지않고 메서드 호출
		sjvo.tot = SungJukService.getTotal2(sjvo.kor, sjvo.eng, sjvo.mat);
		
		System.out.println(sjvo.tot);
		
	}

}	//클래스 열기
class Rent {
	int retno;
	int bookno;
	int memberno;
	void showRentInfo(){
		
		System.out.println(retno);
		System.out.println(bookno);
		System.out.println(memberno);
		
	} //클래스 닫기
}
class staticRent {
	static int retno;
	static int bookno;
	static int memberno;
	String rentdate;	//static 으로 선언되지 않았음
	
	static void showRentInfo(){
			
		System.out.println(retno);
		System.out.println(bookno);
		System.out.println(memberno);
	//	System.out.println(rentdate);	//오류 발생!
		//static 메서드에서는 static 변수가 아니라면 사용이 불가능
		//하지만, rentdate 를 사용하고 싶다면
		staticRent sr = new staticRent();
		System.out.println(sr.rentdate);
		
		}
}


class SungJuk {
	int kor;
	int eng;
	int mat;
	int tot;
	
	public SungJuk() {}
	
	public SungJuk(int kor, int eng, int mat) {
		
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;
		
	}
	
	int showTotal(){
		return kor + eng + mat;
	}
	
}


//성적 클래스 : 성적에 관련된 데이터만 저장
//즉, 멤버변수만 존재하고 그것을 처리하는 메서드는 없음
class SungJukVO {
	
	String name;
	int kor;
	int eng;
	int mat;
	int tot;
	
	public SungJukVO() {}
	
	public SungJukVO(int kor, int eng, int mat) {
		
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;
		
	}
	
	
}


//성적 데이터에 대한 총점, 평균, 학점 등을 처리하는 클래스

class SungJukService{
	
	int getTotal(int kor, int eng, int mat){		//형식 매개변수()안에 있는 것이 매개변수 이다.
		return kor + eng + mat;
	}
	
	
	static int getTotal2(int kor, int eng, int mat){		//메서드를 static 으로 선언
		return kor + eng + mat;
	}
	
}

